<?php
/**
 * 描述：基本图像处理类
 * @name
 * @package
 * @file                $RCSfile:$
 * @version				$Revision:$
 * @modifiedby			$Author:$
 * @lastmodified		$Date:$
 */

//定义错误号
define("__IMAGE_ERROR_NO", -1);


/**
 * 包含基础的图像操作函数
 * 生成所旅途、生成验证码图
 */
class Lib_Image
{
	/**
	 * 构造函数
	 */
	function Image(){}

	//按比例缩小图片
	function AuTothumb($filename,$maxw,$maxh,$path)
	{
		$ret = false;
		if(class_exists('Imagick'))
		{
			$image_handle =@fopen($filename, "r");
			if($image_handle)
			{
				@$im = new Imagick();
				@$im->readImageFile($image_handle);
				@$im->thumbnailImage($maxw,$maxh,true);
				@$ret = $im->writeImage($path);
				@$im->destroy();
				fclose($image_handle);
			}
		}
		else
		{
			list($width, $height) = getimagesize($filename);
			if($width>$height&&$width>$maxw)
			{
				$percent = $maxw/$width;
			}
			elseif($height>$width&&$width>$maxh)
			{
				$percent = $maxh/$height;
			}
			else
			{
				$percent = 1;
			}
			$newwidth = $width * $percent;
			$newheight = $height * $percent;

			// Load
			$thumb = imagecreatetruecolor($newwidth, $newheight);
			$source = imagecreatefromjpeg($filename);

			// Resize
			imagecopyresized($thumb, $source, 0, 0, 0, 0, $newwidth, $newheight, $width, $height);

			// Output
			$ret = imagejpeg($thumb,$path);
			imagedestroy($thumb);
		}
		return $ret;
	}

	//new imagemagik code
	function newCheckCode($checkCode='', $imgX=85, $imgY=30,$fontsize=20)
	{
		$Imagick = new Imagick();
		/* Create the ImagickPixel object (used to set the background color on image) */
		$bg = new ImagickPixel();

		/* Set the pixel color to white */
		$bg->setColor( 'white' );

		/* Create a drawing object and set the font size */
		$ImagickDraw = new ImagickDraw();

		/* Set font and font size. You can also specify /path/to/font.ttf */
		//$ImagickDraw->setFont( 'Helvetica Regular' );
		$ImagickDraw->setFontSize( $fontsize );

		/* Create new empty image */
		$Imagick->newImage( $imgX, $imgY, $bg );

		/* Write the text on the image */
		$Imagick->annotateImage( $ImagickDraw, 4, 20, 0, $checkCode );

		/* Add some swirl */
		$Imagick->swirlImage( 10 );

		/* Create a few random lines */
		$ImagickDraw->line( rand( 0, 70 ), rand( 0, 30 ), rand( 0, 70 ), rand( 0, 30 ) );
		//$ImagickDraw->line( rand( 0, 70 ), rand( 0, 30 ), rand( 0, 70 ), rand( 0, 30 ) );
		//$ImagickDraw->line( rand( 0, 70 ), rand( 0, 30 ), rand( 0, 70 ), rand( 0, 30 ) );
		$ImagickDraw->line( rand( 0, 70 ), rand( 0, 30 ), rand( 0, 70 ), rand( 0, 30 ) );
		$ImagickDraw->line( rand( 0, 70 ), rand( 0, 30 ), rand( 0, 70 ), rand( 0, 30 ) );

		/* Draw the ImagickDraw object contents to the image. */
		$Imagick->drawImage( $ImagickDraw );

		/* Give the image a format */
		$Imagick->setImageFormat( 'png' );

		/* Send headers and output the image */
		header( "Content-Type: image/{$Imagick->getImageFormat()}" );
		echo $Imagick->getImageBlob( );
	}

	/**
	 * 产生一个验证码图片（调用本方法之前必须先调用createRandomCode方法）
	 *
	 * @param int $imgX 图片的X轴
	 * @param int $imgY  图片Y轴
	 * @return void
	 */
	function makeCheckCodeImage($checkCode='', $imgX=65, $imgY=22)
	{
		$this->mCheckCode = $checkCode;
		if ($this->mCheckCode == '')
		{
			$this->createCheckCode();
		}

		//产生一个图片
		$im = imagecreate($imgX, $imgY);
		$black = ImageColorAllocate($im, 0, 0, 0);// 背景颜色
		$white = ImageColorAllocate($im, 255, 255, 255); // 前景颜色
        ImageFill($im, 5, 5, $white);
        imagestring($im, 5, 10, 3, $this->mCheckCode, $black);

		//加入干扰象素
		for($i=0;$i<100;$i++)
		{
			$randcolor = ImageColorallocate($im,rand(0,235),rand(0,235),rand(0,235));
			imagesetpixel($im, rand()%70 , rand()%30 , $randcolor);
		}
		//输出图像
		Header("Content-type: image/PNG");
		ImagePNG($im);
		ImageDestroy($im);
	}

	/**
	 * 生成一个验证码
	 *
	 * @param int $length 验证码的长度，不超过32位，缺省为4位
	 * @param bool $isUpperCase 是否是大写，缺省是小写
	 * @return 返回最后生成的验证码
	 */
	function createCheckCode($lenght=4, $isUpperCase=false){
		$code = substr(md5(rand()), 0, $lenght);
		$this->mCheckCode = ( $isUpperCase ? strtoupper($code) : strtolower($code) );
		return $this->mCheckCode;
	}


	/*
	* PHP图片水印 (水印支持图片或文字)
	*
	* @param string   $groundImage   背景图片，即需要加水印的图片，暂只支持GIF,JPG,PNG格式；
	* @param int      $waterPos     水印位置，有10种状态，0为随机位置；
	* 1为顶端居左，2为顶端居中，3为顶端居右；
	* 4为中部居左，5为中部居中，6为中部居右；
	* 7为底端居左，8为底端居中，9为底端居右；
	* @param string   $waterImage     图片水印，即作为水印的图片，暂只支持GIF,JPG,PNG格式；
	* @param string   $waterText     文字水印，即把文字作为为水印，支持ASCII码，不支持中文；
	* @param string   $textFont     文字大小，值为1、2、3、4或5，默认为5；
	* @param string   $textColor     文字颜色，值为十六进制颜色值，默认为#FF0000(红色)；
	* @return 失败返回错误对象
	*
	* 注意：Support GD 2.0，Support FreeType、GIF Read、GIF Create、JPG 、PNG
	* $waterImage 和 $waterText 最好不要同时使用，选其中之一即可，优先使用 $waterImage。
	* 当$waterImage有效时，参数$waterString、$stringFont、$stringColor均不生效。
	* 加水印后的图片的文件名和 $groundImage 一样。
	*/
	function makeImageWater($groundImage,$waterPos=0,$waterImage="",$waterText="",$textFont=5,$textColor="#FF0000")
	{

		$isWaterImage = false;
		$formatMsg = "暂不支持该文件格式，请用图片处理软件将图片转换为GIF、JPG、PNG格式。";

		//读取水印文件
		if(!empty($waterImage) && file_exists($waterImage)) {
			$isWaterImage = TRUE;
			$water_info = getimagesize($waterImage);
			$water_w   = $water_info[0]; //取得水印图片的宽
			$water_h   = $water_info[1]; //取得水印图片的高

			switch($water_info[2]) { //取得水印图片的格式
				case 1:$water_im = imagecreatefromgif($waterImage);break;
				case 2:$water_im = imagecreatefromjpeg($waterImage);break;
				case 3:$water_im = imagecreatefrompng($waterImage);break;
				default:die($formatMsg);
			}
		}

		//读取背景图片
		if(!empty($groundImage) && file_exists($groundImage)) {
			$ground_info = getimagesize($groundImage);
			$ground_w   = $ground_info[0]; //取得背景图片的宽
			$ground_h   = $ground_info[1]; //取得背景图片的高

			switch($ground_info[2]) { //取得背景图片的格式
				case 1:$ground_im = imagecreatefromgif($groundImage);break;
				case 2:$ground_im = imagecreatefromjpeg($groundImage);break;
				case 3:$ground_im = imagecreatefrompng($groundImage);break;
				default:die($formatMsg);
			}
		} else {
			return "需要加水印的图片不存在！";
		}

		//水印位置
		if($isWaterImage) {//图片水印
			$w = $water_w;
			$h = $water_h;
			$label = "图片的";
		} else {//文字水印
			$temp = imagettfbbox(ceil($textFont*5),0,"./cour.ttf",$waterText);//取得使用 TrueType 字体的文本的范围
			$w = $temp[2] - $temp[6];
			$h = $temp[3] - $temp[7];
			unset($temp);
			$label = "文字区域";
		}
		if( ($ground_w<$w) || ($ground_h<$h) ) 	{
			return "需要加水印的图片的长度或宽度比水印".$label."还小，无法生成水印！";
		}
		switch($waterPos) {
			case 0://随机
				$posX = rand(0,($ground_w - $w));
				$posY = rand(0,($ground_h - $h));
				break;
			case 1://1为顶端居左
				$posX = 0;
				$posY = 0;
				break;
			case 2://2为顶端居中
				$posX = ($ground_w - $w) / 2;
				$posY = 0;
				break;
			case 3://3为顶端居右
				$posX = $ground_w - $w;
				$posY = 0;
				break;
			case 4://4为中部居左
				$posX = 0;
				$posY = ($ground_h - $h) / 2;
				break;
			case 5://5为中部居中
				$posX = ($ground_w - $w) / 2;
				$posY = ($ground_h - $h) / 2;
				break;
			case 6://6为中部居右
				$posX = $ground_w - $w;
				$posY = ($ground_h - $h) / 2;
				break;
			case 7://7为底端居左
				$posX = 0;
				$posY = $ground_h - $h;
				break;
			case 8://8为底端居中
				$posX = ($ground_w - $w) / 2;
				$posY = $ground_h - $h;
				break;
			case 9://9为底端居右
				$posX = $ground_w - $w;
				$posY = $ground_h - $h;
				break;
			default://随机
				$posX = rand(0,($ground_w - $w));
				$posY = rand(0,($ground_h - $h));
				break;
		}

		//设定图像的混色模式
		imagealphablending($ground_im, true);

		if($isWaterImage) {//图片水印
			imagecopy($ground_im, $water_im, $posX, $posY, 0, 0, $water_w,$water_h);//拷贝水印到目标文件
		} else {//文字水印
			if( !empty($textColor) && (strlen($textColor)==7) ) {
				$R = hexdec(substr($textColor,1,2));
				$G = hexdec(substr($textColor,3,2));
				$B = hexdec(substr($textColor,5));
			} else {
				return "水印文字颜色格式不正确！";
			}
			imagestring ( $ground_im, $textFont, $posX, $posY, $waterText, imagecolorallocate($ground_im, $R, $G, $B));
		}

		//生成水印后的图片
		@unlink($groundImage);
		switch($ground_info[2]) {//取得背景图片的格式
			case 1: imagegif($ground_im,$groundImage); break;
			case 2: imagejpeg($ground_im,$groundImage); break;
			case 3: imagepng($ground_im,$groundImage); break;
			default: die($errorMsg);
		}

		//释放内存
		if(isset($water_info)) unset($water_info);
		if(isset($water_im)) imagedestroy($water_im);
		unset($ground_info);
		imagedestroy($ground_im);
	}


}



 ?>